home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / MIDI8031 / PHONEM.S51 < prev    next >
Encoding:
Text File  |  1987-04-21  |  9.6 KB  |  376 lines

  1. ; ***************************************************************
  2. ; *
  3. ; * MIDI8031 Sprachsynthesizer (C) JP 1992
  4. ; *
  5. ; * Um dieses Programm nutzen zu koennen, muss zwischen
  6. ; * Portpin P1.0 (Buchsenleiste Pin 3) und +5 Volt
  7. ; * (Buchsenleiste Pin 2) ein Lautsprecher an-
  8. ; * geschlossen werden:
  9. ; *
  10. ; * (3) <----[R1=150 Ohm]-----+-----[L1=1 MiliHenry]-----+
  11. ; *                           |                          | /|
  12. ; * zum               [C1=2.2 MikroFarad]               [ ] | Laut-
  13. ; * MIDI8031                  |                         [ ] | sprecher
  14. ; *                           |                          | \| 45 Ohm
  15. ; * (2) <---------------------+--------------------------+
  16. ; * 
  17. ; * Der Wiederstand des Lautsprechers sollte 45 Ohm betragen
  18. ; * Alternativ dazu geht auch eine 4-8 Ohm-Typ mit vorgeschaltetem
  19. ; * 20 Ohm-Wdst (nur eben viel leiser). Falls keine Spule zur
  20. ; * Verfuegung steht, kann sie durch einen 50 Ohm Wdst. ersetzt
  21. ; * werden. Allerdings ist dann das 8 KiloHertz PWM-Signal staerker
  22. ; * als (stoerendes) Pfeifen zu hoeren.
  23. ; *                                                          
  24. ; ***************************************************************
  25.  
  26.     .registers reg51.inc    ; 8031-Registerdefinition
  27.  
  28. ; *** Die Variable fenster bestimmt die Ablaufgeschwindigkeit
  29. ; *** der Sprache: Werte zwischen 14..128..256 sind erlaubt
  30. ; *** Der Normalwert ist 128
  31.  
  32. fenster = 128                ; ( 0 = 256)
  33.  
  34. ; *** Variablen Internes RAM, oberhalb BITFELD***
  35.     .var_org $30        ; Variablen-PC setzen
  36.  
  37. frq:     .ds.b 6            ; Frequenzen
  38. vol:     .ds.b 6            ; Lautstaerken
  39. pos:     .ds.b 6            ; Positionen im Sample
  40. adko:    .ds.b 1            ; Add.w. wg. mulu + 128 wg Timer
  41. wert:     .ds.b 1            ; Laufende Summe
  42. copy:    .ds.b 13        ; Shiftbereich 6 frq/6 vol/adko
  43. phopo:    .ds.b 2            ; Roving Phonems Pointer L/H
  44.  
  45. stack:                    ; Ab hier das restliche RAM fuer den Stack
  46.  
  47.  
  48. ; *** Code: Ab hier beginnt das eigentliche Programm ***
  49.  
  50.     .text_org $8000
  51.  
  52. ; *** 'Interruptbereich' wie EPROM ab Adresse 0 ***
  53.         ljmp go
  54.  
  55. int0:    reti
  56.         .ds.b 7
  57. timer0:    setb P1.0            ; Bit P1.0 setzen (PWM-Off)
  58.         reti
  59.         .ds.b 5
  60. int1:    reti
  61.         .ds.b 7
  62. timer1:    reti
  63.         .ds.b 7
  64. serial:    reti
  65.         .ds.b 7
  66.  
  67. ; **** Hauptroutine ***
  68. go:
  69.     clr P3.5            ; LED aus
  70.     mov SP,#stack        ; Stack starten
  71.  
  72.     mov phopo,#phono&255
  73.     mov phopo+1,#phono/256
  74.  
  75.     acall play
  76.  
  77.     sjmp go
  78.  
  79. ; **** Pulsplayer ***
  80.  
  81. play:
  82.     mov copy,#0            ; frq's Initialisieren
  83.     mov copy+1,#0
  84.     mov copy+2,#0
  85.     mov copy+3,#0
  86.     mov copy+4,#0
  87.     mov copy+5,#0
  88.     mov copy+6,#0        ; vol's Initialisieren
  89.     mov copy+7,#0
  90.     mov copy+8,#0
  91.     mov copy+9,#0
  92.     mov copy+10,#0
  93.     mov copy+11,#0
  94.     mov copy+12,#192    ; 128: (adko) Wandler
  95.  
  96.  
  97. ; *** say: Phonemsynthese ***
  98. say:    
  99.     mov pos,#0            ; POS Initialisieren
  100.     mov pos+1,#0
  101.     mov pos+2,#0
  102.     mov pos+3,#0
  103.     mov pos+4,#0
  104.     mov pos+5,#0
  105.  
  106. ; * Interrupt TO an
  107.     clr IE.1            ; T0 Interrupt disablen
  108.     setb TCON.4            ; TR0 Timer 0 laeuft
  109.     orl TMOD,#%11        ; M0=3
  110.     mov TL0,#0            ; Timer resetten
  111.     setb IE.7            ; Gennerell Interrupts zulassen
  112.     setb IE.1            ; T0 Interrupt Ein
  113.  
  114.     mov DPTR,#sitab        ; Auf Sinustabelle zeigen
  115.  
  116.     mov R7,#14            ; Quickstart
  117.     ajmp s0                ; Hier geht's los
  118.  
  119. ; **** Main-Synthese-Block Anfang ****
  120. ; **** In diesem Block wird ein Abtastwert errechnet,
  121. ; **** indem er aus 6 Frequenzkomponenten zusammengesetzt wird
  122. s3:
  123.     nr=0                ; Index des Kanals        
  124.     mov A,pos+nr        ; 1 Position holen
  125.     movc A,@A+DPTR        ; 2 A=sin(posx)
  126.     mov B,vol+nr        ; 2 B=volx
  127.     mul AB                ; 4 Volume berechnen
  128.     mov wert,B            ; 1 A=sin(posx)*volx
  129.     mov A,frq+nr        ; 1 Frequenz holen
  130.     add A,pos+nr        ; 1 Index steppen
  131.     mov pos+nr,A        ; 1 merken
  132.  
  133.     nr=1
  134.     mov A,pos+nr
  135.     movc A,@A+DPTR
  136.     mov B,vol+nr
  137.     mul AB
  138.     mov A,B
  139.     add A,wert
  140.     mov wert,A
  141.     mov A,frq+nr
  142.     add A,pos+nr
  143.     mov pos+nr,A
  144.  
  145.     nr=2
  146.     mov A,pos+nr
  147.     movc A,@A+DPTR
  148.     mov B,vol+nr
  149.     mul AB
  150.     mov A,B
  151.     add A,wert
  152.     mov wert,A
  153.     mov A,frq+nr
  154.     add A,pos+nr
  155.     mov pos+nr,A
  156.  
  157.     nr=3
  158.     mov A,pos+nr
  159.     movc A,@A+DPTR
  160.     mov B,vol+nr
  161.     mul AB
  162.     mov A,B
  163.     add A,wert
  164.     mov wert,A
  165.     mov A,frq+nr
  166.     add A,pos+nr
  167.     mov pos+nr,A
  168.  
  169.     nr=4
  170.     mov A,pos+nr
  171.     movc A,@A+DPTR
  172.     mov B,vol+nr
  173.     mul AB
  174.     mov A,B
  175.     add A,wert
  176.     mov wert,A
  177.     mov A,frq+nr
  178.     add A,pos+nr
  179.     mov pos+nr,A
  180.  
  181.     nr=5
  182.     mov A,pos+nr
  183.     movc A,@A+DPTR
  184.     mov B,vol+nr
  185.     mul AB
  186.     mov A,B
  187.  
  188.     add A,wert
  189.     add A,adko            ; Addition volume+Timer
  190.     jnc s2                ; Nicht oberer Anschlag
  191.     mov A,#-1            ; Maximum
  192. s2: clr    P1.0            ; +1 Lautsprecher an!
  193.     mov TL0,A            ; Spezial: Timer
  194.  
  195.     add A,#126            ; Finden der Konstante durch Testreihe
  196.     jc s6                ; C: > als Minimum gewesen
  197.     mov TL0,#133         ; Timer kurz aus
  198. s6:
  199.     
  200.     mov A,frq+nr
  201.     add A,pos+nr
  202.     mov pos+nr,A
  203. ; **** Main-Synthese-Block Ende, 93 Zyklen ****
  204.  
  205.     djnz R7,s1            ; 2
  206.     mov R7,#fenster        ; Anzahl Synthesebytes
  207. s0:                        ; *** Start loop ***
  208.  
  209.     mov A,copy            ; frq0>127: Ende
  210.     jb ACC.7,s5            ; Zu hohe Frq!
  211.     mov frq,A            ; sonst eintragen
  212.  
  213.     mov frq+1,copy+1
  214.     mov frq+2,copy+2
  215.     mov frq+3,copy+3
  216.     mov frq+4,copy+4
  217.     mov frq+5,copy+5
  218.     mov vol,copy+6        ; vol shiften
  219.     mov vol+1,copy+7
  220.     mov vol+2,copy+8
  221.     mov vol+3,copy+9
  222.     mov vol+4,copy+10
  223.     mov vol+5,copy+11
  224.     mov adko,copy+12    ; adko shiften
  225.     ajmp s3
  226.  
  227. ; **** Fertig ****
  228. s5:
  229.     clr IE.1            ; Interrupt Aus!
  230.     setb P1.0            ; Port: Strom aus!
  231.     ret                    ; Fertig!
  232.  
  233. ; *** Transportschleife (Daten->Copy) ***
  234. s4:
  235.     mov R6,#2            ; R6: Wartezyklenzaehler
  236.     djnz R6,!            ; R6*2
  237.  
  238.     mov A,#copy+13        ; 1
  239.     clr C                ; 1
  240.     subb A,R7            ; 1
  241.     mov R0,A            ; 1
  242.  
  243.     mov DPL,phopo        ; 2 DPTR laden
  244.     mov DPH,phopo+1        ; 2
  245.     clr A                ; 1
  246.     movc A,@A+DPTR         ; 2
  247.     inc DPTR            ; 2
  248.     mov phopo,DPL        ; 2 DPTR abspeichern
  249.     mov phopo+1,DPH        ; 2
  250.     mov @R0,A            ; 1
  251.     mov DPTR,#sitab        ; 2 Alte Tabelle
  252.  
  253.     ajmp s3
  254.  
  255. ; **** Warteschleife/Arbeit? ****
  256. s1:
  257.     mov A,R7            ; 1
  258.     add A,#-14            ; 1
  259.     jnc s4                ; 2
  260.     
  261.     mov R6,#12            ; R6: Wartezyklenzaehler
  262.     djnz R6,!            ; R6*2
  263.  
  264.     ajmp s3                ; fertig...
  265.  
  266. sitab:
  267.     .hide                    ; Ab hier Unsichtbar...
  268.  
  269.     .ibytes sinus.img        ; 256 * [0..128..255] Sinustabelle
  270.  
  271.  
  272. ; * Ab hier befinden sich die Sprachinformationen
  273. phono:
  274. ; Die Anfangs-Glocke...
  275. ad=150
  276. v=255
  277.     .dc.b 20,19,0,0,0,0,v,v/10,0,0,0,0,ad
  278.     .dc.b 20,18,0,0,0,0,v/2,v/11,0,0,0,0,ad
  279.     .dc.b 20,17,0,0,0,0,v/3,v/12,0,0,0,0,ad
  280.     .dc.b 20,16,0,0,0,0,v/4,v/13,0,0,0,0,ad
  281.     .dc.b 20,15,0,0,0,0,v/5,v/14,0,0,0,0,ad
  282.     .dc.b 20,0,0,0,0,0,v/6,0,0,0,0,0,ad
  283.     .dc.b 20,0,0,0,0,0,v/7,0,0,0,0,0,ad
  284.     .dc.b 20,0,0,0,0,0,v/8,0,0,0,0,0,ad
  285.     .dc.b 20,0,0,0,0,0,v/9,0,0,0,0,0,ad
  286.     .dc.b 20,0,0,0,0,0,v/10,0,0,0,0,0,ad
  287.     .dc.b 20,0,0,0,0,0,v/11,0,0,0,0,0,ad
  288.     .dc.b 20,0,0,0,0,0,v/12,0,0,0,0,0,ad
  289.     .dc.b 20,0,0,0,0,0,v/13,0,0,0,0,0,ad
  290.     .dc.b 20,0,0,0,0,0,v/14,0,0,0,0,0,ad
  291.     .dc.b 20,0,0,0,0,0,v/15,0,0,0,0,0,ad
  292.     .dc.b 20,0,0,0,0,0,v/16,0,0,0,0,0,ad
  293.     .dc.b 20,0,0,0,0,0,v/17,0,0,0,0,0,ad
  294.     .dc.b 20,0,0,0,0,0,v/18,0,0,0,0,0,ad
  295.     .dc.b 20,0,0,0,0,0,v/19,0,0,0,0,0,ad
  296.  
  297.     .dc.b 40,19,0,0,0,20,v,v/10,0,0,10,0,ad
  298.     .dc.b 40,18,0,0,0,21,v/2,v/11,0,10,0,0,ad
  299.     .dc.b 40,17,0,0,0,21,v/3,v/12,0,10,0,0,ad
  300.     .dc.b 40,16,0,0,0,20,v/4,v/13,0,10,0,0,ad
  301.     .dc.b 40,15,0,0,0,21,v/5,v/14,0,10,0,0,ad
  302.     .dc.b 40,0,0,0,0,21,v/6,0,0,0,0,10,ad
  303.     .dc.b 40,0,0,0,0,20,v/7,0,0,0,0,10,ad
  304.     .dc.b 40,0,0,0,0,21,v/8,0,0,0,0,10,ad
  305.     .dc.b 40,0,0,0,0,21,v/9,0,0,0,0,10,ad
  306.     .dc.b 40,0,0,0,0,20,v/10,0,0,0,0,11,ad
  307.     .dc.b 40,0,0,0,0,21,v/11,0,0,0,0,12,ad
  308.     .dc.b 40,0,0,0,0,21,v/12,0,0,0,0,13,ad
  309.     .dc.b 40,0,0,0,0,20,v/13,0,0,0,0,14,ad
  310.     .dc.b 40,0,0,0,0,20,v/15,0,0,0,0,15,ad
  311.     .dc.b 40,0,0,0,0,21,v/17,0,0,0,0,14,ad
  312.     .dc.b 40,0,0,0,0,21,v/20,0,0,0,0,13,ad
  313.     .dc.b 40,0,0,0,0,20,v/22,0,0,0,0,12,ad
  314.     .dc.b 40,0,0,0,0,21,v/25,0,0,0,0,6,ad
  315.     .dc.b 40,0,0,0,0,21,v/30,0,0,0,0,2,ad
  316.  
  317.     .dc.b 30,19,0,0,40,20,v,v/10,0,10,10,0,ad
  318.     .dc.b 40,18,0,0,40,21,v/2,v/11,10,10,0,0,ad
  319.     .dc.b 30,17,0,0,40,21,v/3,v/12,10,10,0,0,ad
  320.     .dc.b 40,16,0,0,40,20,v/4,v/13,10,10,0,0,ad
  321.     .dc.b 30,15,0,0,40,21,v/5,v/14,10,10,0,0,ad
  322.     .dc.b 40,0,0,0,40,21,v/6,0,0,0,10,10,ad
  323.     .dc.b 30,0,0,0,40,20,v/7,0,0,0,10,10,ad
  324.     .dc.b 40,0,0,0,40,21,v/8,0,0,0,10,10,ad
  325.     .dc.b 30,0,0,0,40,21,v/9,0,0,0,10,10,ad
  326.     .dc.b 40,0,0,0,40,20,v/10,0,0,0,9,11,ad
  327.     .dc.b 30,0,0,0,40,21,v/11,0,0,0,9,12,ad
  328.     .dc.b 40,0,0,0,40,21,v/12,0,0,0,9,13,ad
  329.     .dc.b 30,0,0,0,40,20,v/13,0,0,0,8,14,ad
  330.     .dc.b 40,0,0,0,40,20,v/15,0,0,0,7,15,ad
  331.     .dc.b 30,0,0,0,40,21,v/17,0,0,0,6,14,ad
  332.     .dc.b 40,0,0,0,40,21,v/20,0,0,0,5,13,ad
  333.     .dc.b 30,0,0,0,40,20,v/22,0,0,0,4,12,ad
  334.     .dc.b 40,0,0,0,40,21,v/25,0,0,0,3,6,ad
  335.     .dc.b 30,0,0,0,40,21,v/30,0,0,0,2,2,ad
  336.  
  337.     .dc.b 30,19,0,0,40,20,v,v/10,0,10,10,0,ad
  338.     .dc.b 20,18,0,0,40,21,v/2,v/11,10,10,0,0,ad
  339.     .dc.b 30,17,0,0,40,21,v/3,v/12,10,10,0,0,ad
  340.     .dc.b 20,16,0,0,40,20,v/4,v/13,10,10,0,0,ad
  341.     .dc.b 30,15,0,0,40,21,v/5,v/14,10,10,0,0,ad
  342.     .dc.b 20,0,0,0,40,21,v/6,0,0,0,10,10,ad
  343.     .dc.b 30,0,0,0,40,20,v/7,0,0,0,10,10,ad
  344.     .dc.b 20,0,0,0,40,21,v/8,0,0,0,10,10,ad
  345.     .dc.b 30,0,0,0,40,21,v/9,0,0,0,10,10,ad
  346.     .dc.b 20,0,0,0,40,20,v/10,0,0,0,9,11,ad
  347.     .dc.b 30,0,0,0,40,21,v/11,0,0,0,9,12,ad
  348.     .dc.b 20,0,0,0,40,21,v/12,0,0,0,9,13,ad
  349.     .dc.b 30,0,0,0,40,20,v/13,0,0,0,8,14,ad
  350.     .dc.b 20,0,0,0,40,20,v/15,0,0,0,7,15,ad
  351.     .dc.b 30,0,0,0,40,21,v/17,0,0,0,6,14,ad
  352.     .dc.b 20,0,0,0,40,21,v/20,0,0,0,5,13,ad
  353.     .dc.b 30,0,0,0,40,20,v/22,0,0,0,4,12,ad
  354.     .dc.b 20,0,0,0,40,21,v/25,0,0,0,3,6,ad
  355.     .dc.b 30,0,0,0,40,21,v/30,0,0,0,2,2,ad
  356.     
  357.     .ds.b 130                ; Kleine Pause
  358.  
  359. ; die Spektralinformation 'mm.p51' wurde mit SMSSEDIT erzeugt
  360. ; Alle 3 Dateien zusammen sind zu gross fuer ein 32KB-EPROM
  361.  
  362. ; * 1.) MM: Ach, was muss man oft von boesen
  363. ;         Kindern hoeren oder lesen...
  364.     .ibytes mm.p51    
  365.  
  366. ; * 2.) POMMES: Vom alten Fritz dem Preussenkoenig
  367. ;             weiss man zwar viel doch viel zuwenig...
  368. ;    .ibytes pommes.p51
  369.  
  370.  
  371. ; * 2.) ZAHL1_10: Die Zahlen, auch als SMSSEDIT-Dateien...
  372. ;    .ibytes zahl1_10.p51
  373.  
  374.     .ds.b 130                ; Kleine Pause
  375.     .dc.b 255                ; End-Zeichen
  376.